package com.iwhalecloud.bss.kite.cucc.service.attr.linkhandler;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import com.iwhalecloud.bss.kite.dataservice.cache.ProductCache;
import org.springframework.stereotype.Service;

import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.util.KiteListUtils;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.common.constant.LocalKeyConsts;
import com.iwhalecloud.bss.kite.cucc.service.attr.handler.ApnSelectAttrHandler;
import com.iwhalecloud.bss.kite.listener.handler.attr.annotation.AttrHandler;
import com.iwhalecloud.bss.kite.listener.handler.attr.impl.AbstractAttrLinkageHandler;
import com.iwhalecloud.bss.kite.manager.enums.ActionType;
import com.iwhalecloud.bss.kite.manager.enums.InstType;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.manager.inst.KiteInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInstFunc;
import com.iwhalecloud.bss.kite.manager.inst.KiteSceneInst;
import com.iwhalecloud.bss.kite.manager.inst.graph.IInstRelGraph;
import com.iwhalecloud.bss.kite.manager.inst.graph.impl.InstVertex;
import com.iwhalecloud.bss.kite.manager.scene.util.InstUtils;
import com.iwhalecloud.bss.kite.manager.scene.util.SceneInstUtils;
import com.iwhalecloud.bss.kite.manager.transaction.TransactionContext;
import com.iwhalecloud.bss.kite.service.attr.AttrData;

/**
* @Description: TODO
*
* @author lyx
* @date 2020年12月31日
* @version V1.0
* @Package com.iwhalecloud.bss.kite.cucc.service.attr.linkhandler
*/
@Service
@AttrHandler(ApnSelectAttrHandler.class)
public class ApnSelectAttrLinkHandler extends AbstractAttrLinkageHandler<AttrData> {

    @Override
    public void handle(KiteAttr attr, KiteInst inst, AttrData data) {

    }

    @Override
    public void handleStyle(KiteAttr attr, KiteInst inst, AttrData data) {
        /**
         * 漫游国家，需要根据选定的APN，获取选定此APN计划的通信计划，根据此通信计划的漫游区域，确定漫游国家
         * 如果通信计划-漫游区域包含国际，则展示资费计划漫游国家
         * 通信计划和资费计划可以关联多个APN，关联的APN完全相同，才判断通信计划和资费计划关联同一个APN
         */
        KiteAttr routeCountry = inst.getAttr("200004028"); // 漫游国家
        if (Objects.isNull(routeCountry)) {
            return;
        }
        List<KiteProdInstFunc> funcs = listProdInstFuncs(data.getSceneInstId());
        funcs = funcs.stream()
            .filter(func -> KiteStringUtils.equalsAny(ProductCache.get(func.getSpecId()).getProdNbr(), "300000151", LocalKeyConsts.FUNC_PROD_ID_YF5GTX))
            .collect(Collectors.toList());
        if (!KiteListUtils.isEmpty(funcs)) {
            funcs = funcs.stream().filter(t -> !ActionType.D.equals(t.getActionType())).collect(Collectors.toList());
            for (KiteProdInstFunc funcProdInst : funcs) {
                // 先获取关联相同的APN，如果没有关联相同的APN，则不联动
                String communicationAPN = funcProdInst.getAttrValue("200004034"); // APN设置（通信计划）
                if (!KiteStringUtils.equals(attr.getValue(), communicationAPN)) {
                    continue;
                }
                KiteAttr wayAttr = funcProdInst.getAttr("200003690"); // 漫游区域

                // 如果有一个符合，就返回。     1_0000225:国际，100006425:国内+国际
                if (Objects.nonNull(wayAttr)) {
                    if ("1_0000225".equals(wayAttr.getValue()) || "100006425".equals(wayAttr.getValue())) {
                        routeCountry.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                        routeCountry.setIsNull(KeyConsts.IFTRUE_F);
                        break;
                    } else if ("1_0000223".equals(wayAttr.getValue())) {
                        // 漫游区域是省内的话，不展示漫游国家
                        routeCountry.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        routeCountry.setIsNull(KeyConsts.IFTRUE_T);
                        break;
                    } else {
                        routeCountry.setIsNull(KeyConsts.IFTRUE_T);
                    }
                } else {
                    routeCountry.setIsNull(KeyConsts.IFTRUE_T);
                }
            }
        }
    }

    public List<KiteProdInstFunc> listProdInstFuncs(String sceneInstId) {
        List<InstVertex> prodInstFuncVertexs = new ArrayList<>();
        KiteSceneInst sceneInst = TransactionContext.getContainer().getSceneInst(sceneInstId);
        String custId = SceneInstUtils.getCustId(sceneInst);
        IInstRelGraph sceneInstRelGraph = SceneInstUtils.getSceneInstRelGraph(sceneInst);
        List<InstVertex> instVertexs = sceneInstRelGraph.listVertexs();
        Iterator<InstVertex> var8 = instVertexs.iterator();

        while (var8.hasNext()) {
            InstVertex instVertex = var8.next();
            if (!Objects.equals(ActionType.X, instVertex.getActionType())
                && Objects.equals(InstType.PROD_INST_FUNC, instVertex.getInstType())) {
                prodInstFuncVertexs.add(instVertex);
            }
        }
        return InstUtils.transformInsts(custId, prodInstFuncVertexs);
    }

}
